#pragma once
#include <interbank.ice>

module Xts
{
	module XInterBank
	{
		//委托状态
		enum XBondOrderState{
			Submitted,					//提交（接受但未成交）
			Rejected,					//拒绝(终结状态)
			PartiallyFilled,			//部分成交
			Filled,						//全部成交（终结状态）
			PendingCancel,				//待撤单
			PartiallyCancelled,			//部分撤单（终结状态，部分已成交，部分已撤单）
			Cancelled					//已撤单(终结状态，全部撤单)
		};
		
		//发送的普通委托
		["clr:class", "cs:attribute:System.Serializable"] 
		struct XSendingOrder
		{
			string						CustomOrderId;			//客户端自定义委托编号
			XBondTag					BondTag;				//债券标识
			XTransactionDirection		OrderDirection;			//交易方向
			XBondPriceType				PriceType;				//价格类型
			double						Price;					//报价
			long						Size;					//报单数量
			int							ClearingSpeed;			//结算速度，0:T+0, 1:T+1, 2:T+2
			Util::XTime					SendingTime;			//报单时间				
		};
		
		//发送做市委托
		["clr:class", "cs:attribute:System.Serializable"] 
		struct XSendingMarketMakingOrder
		{
			string						CustomOrderId;			//客户端自定义委托编号
			XBondTag					BondTag;				//债券标识
			XBondPriceType				BidPriceType;			//买单价格类型
			double						BidPrice;				//买单报价
			long						BidSize;				//买单报单数量
			int							BidClearingSpeed;		//买单结算速度，0:T+0, 1:T+1, 2:T+2
			XBondPriceType				AskPriceType;			//卖单价格类型
			double						AskPrice;				//卖单报价
			long						AskSize;				//卖单报单数量
			int							AskClearingSpeed;		//卖单结算速度，0:T+0, 1:T+1, 2:T+2
			Util::XTime					SendingTime;			//报单时间		
		};
		
		//委托成交信息，一次成交产生一个XBondOrderFill对象
		["clr:class", "cs:attribute:System.Serializable"] 
		struct XBondOrderFill
		{
			string						TransactionId;			//成交编号
			string						OrderId;				//委托编号
			string						CustomOrderId;			//客户端自定义委托编号
			XTransactionDirection		OrderDirection;			//交易方向
			double						Commission;				//佣金
			double						Price;					//该笔成交价
			long						Size;					//该笔成交量
			Util::XTime					FillTime;				//该笔成交时间
		};
		//XBondOrderFill序列（C# Array, C++ std::vector）
		sequence<XBondOrderFill> XBondOrderFillSeries;
		
		//普通委托信息， 表示当前该委托的统计状态
		["clr:class", "cs:attribute:System.Serializable"] 
		struct XBondOrderInfo
		{
			string						OrderId;				//委托编号
			string						CustomOrderId;			//客户端自定义委托编号
			string						AccountId;				//账户ID
			string						Initiator;				//发起机构
			string						TraderId;				//交易员ID
			XBondTag					BondTag;				//债券标识
			XTransactionDirection		OrderDirection;			//交易方向
			XBondPriceType				PriceType;				//价格类型
			double						QuotePrice;				//委托报价
			long						QuoteSize;				//委托报单量
			XBondOrderState				OrderState;				//委托状态
			long						FilledSize;				//已成交量
			double						AvgDealPrice;			//平均成交价
			double						TotalCommission;		//总手续费
			int							ClearingSpeed;			//结算速度，0:T+0, 1:T+1, 2:T+2
			Util::XTime					SendingTime;			//报单时间	
			Util::XTime					UpdateTime;				//数据更新时间
		};
		//XBondOrderInfo序列（C# Array, C++ std::vector）
		sequence<XBondOrderInfo> XBondOrderInfoSeries;
		
		//普通委托对象
		["clr:class", "cs:attribute:System.Serializable"] 
		struct XBondOrder
		{
			XBondOrderInfo				OrderInfo;				//普通委托信息
			XBondOrderFillSeries		FillList;				//该委托成交序列
		};
		//XBondOrder序列（C# Array, C++ std::vector）
		sequence<XBondOrder> XBondOrderSeries;					
		
		//做市委托信息
		["clr:class", "cs:attribute:System.Serializable"] 
		struct XBondMarketMakingOrderInfo
		{
			string						OrderId;				//委托编号
			string						CustomOrderId;			//客户端自定义委托编号
			string						AccountId;				//账户ID
			string						Initiator;				//发起机构
			string						TraderId;				//交易员ID
			XBondTag					BondTag;				//债券标识
			XBondPriceType				BidPriceType;			//买单价格类型
			double						BidPrice;				//买单报价
			long						BidSize;				//买单报单数量
			int							BidClearingSpeed;		//买单结算速度，0:T+0, 1:T+1, 2:T+2			
			XBondPriceType				AskPriceType;			//卖单价格类型
			double						AskPrice;				//卖单报价
			long						AskSize;				//卖单报单数量
			int							AskClearingSpeed;		//卖单结算速度，0:T+0, 1:T+1, 2:T+2
			XBondOrderState				OrderState;				//委托状态
			long						FilledBuySize;			//买单已成交量
			double						AvgBuyDealPrice;		//买单平均成交价
			double						BuyCommission;			//买单总手续费
			long						FilledSellSize;			//卖单已成交量
			double						AvgSellDealPrice;		//卖单平均成交价
			double						SellCommission;			//卖单总手续费
			double						TotalCommission;		//总手续费
			Util::XTime					SendingTime;			//报单时间	
			Util::XTime					UpdateTime;				//数据更新时间
		};
		
		//做市委托对象
		["clr:class", "cs:attribute:System.Serializable"] 
		struct XBondMarketMakingOrder
		{
			XBondMarketMakingOrderInfo	OrderInfo;				//做市委托信息
			XBondOrderFillSeries		BuyFillList;			//该委托买单成交序列
			XBondOrderFillSeries		SellFillList;			//该委托卖单成交序列
		};
		//XBondMarketMakingOrder序列（C# Array, C++ std::vector）
		sequence<XBondMarketMakingOrder> XBondMarketMakingOrderSeries;	
		
		//报单请求返回
		["clr:class", "cs:attribute:System.Serializable"] 
		struct XSendOrderRsp
		{
			XOprtInfo					OprtInfo;				//操作结果信息
			string						CustomOrderId;			//客户端自定义委托编号，按客户端发起委托远洋返回
			string						OrderId;				//委托编号，交易所返回的委托编号，如果操作失败该字段不可用
		};
		
		//撤单请求参数
		["clr:class", "cs:attribute:System.Serializable"] 
		struct XCancelOrderReq
		{
			string						OrderId;				//被撤委托编号，如服务端支持按客户端自定义委托编号撤单，则该字段可不填（空字符串），如填写该字段则优先按该字段撤单
			string						CustomOrderId;			//被撤委托客户端自定义委托编号，如服务端不支持按客户端自定义委托编号撤单，或已填写OrderId，该字段会被忽略
		};
		//XCancelOrderReq序列（C# Array, C++ std::vector），用于批量撤单
		sequence<XCancelOrderReq> XCancelOrderReqSeries;
		
		//撤单请求返回
		["clr:class", "cs:attribute:System.Serializable"] 
		struct XCancelOrderRsp
		{
			XOprtInfo					OprtInfo;				//操作结果信息
			string						OrderId;				//被撤委托编号
			string						CustomOrderId;			//被撤委托客户端自定义委托编号
		};
		//XCancelOrderRsp序列（C# Array, C++ std::vector），用于批量撤单返回
		sequence<XCancelOrderRsp> XCancelOrderRspSeries;
		
		//交易委托接口
		["amd"] interface IXOrderDelivery
		{
			XSendOrderRsp				SendOrder(XSendingOrder sendingOrder);
			XSendOrderRsp				SendMarketMakingOrder(XSendingMarketMakingOrder sendingOrder);
			XCancelOrderRsp				CancelOrder(XCancelOrderReq req);			
			XCancelOrderRspSeries		BatchCancelOrder(XCancelOrderReqSeries reqList);
		};
		
		//交易回报回调接口(客户端实现)
		interface IXOrderNortifyer
		{
			void OrderInfoNortify(XBondOrderInfo orderInfo);							//普通委托信息推送
			void OrderFillNortify(XBondOrderFill orderFill);							//普通委托成交推送
			void MarketMakingOrderInfoNortify(XBondMarketMakingOrderInfo orderInfo); 	//做市委托信息推送
			void MarketMakingOrderFillNortify(XBondOrderFill orderFill);				//做市委托成交推送
		};
		
		//委托信息查询返回结果
		["clr:class", "cs:attribute:System.Serializable"] 
		struct XBondOrderInfoQueryRsp
		{
			XOprtInfo					OprtInfo;				//操作结果信息，如果查询成功返回true，如果全部或部分未查到，返回false			
			XBondOrderInfoSeries		OrderInfoList;			//委托信息序列，如果未查到，该序列空，若为单个委托查询，序列长度为1，多个委托为n
		};
		
		//成交信息查询返回结果
		["clr:class", "cs:attribute:System.Serializable"] 
		struct XBondOrderFillQueryRsp
		{
			XOprtInfo					OprtInfo;				//操作结果信息
			string						Initiator;				//发起机构
			string						TraderId;				//交易员ID
			string						AccountId;				//账户ID
			XBondOrderFillSeries		OrderFillList;			//成交信息序列
		};
		
		//交易查询接口
		["amd"] interface IXTradingQuery
		{
			XBondOrderInfoQueryRsp		QueryOrderInfo(string orderId, string customOrderId);	//查询单个委托信息，参数为委托编号和客户端自定义委托编号
			XBondOrderInfoQueryRsp		BatchQueryOrderInfo(string accountId);					//查询某账户下委托信息，参数为账户ID
			XBondOrderFillQueryRsp		QueryOrderFill(string orderId, string customOrderId);	//查询单个委托成交信息，参数为委托编号和客户端自定义委托编号
			XBondOrderFillQueryRsp		BatchQueryOrderFill(string accountId);					//查询某账户下成交信息，参数为账户ID
		};
		
		
	};
};